package com.zhongxi.guoyuan.view.beautifulStore;

import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AlertDialog;
import android.text.SpannableString;
import android.text.TextUtils;
import android.util.Log;
import android.util.Xml;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.alipay.sdk.app.PayTask;
import com.bumptech.glide.Glide;
import com.google.gson.Gson;
import com.tencent.mm.sdk.modelpay.PayReq;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import com.zhongxi.guoyuan.R;
import com.zhongxi.guoyuan.application.MyApplication;
import com.zhongxi.guoyuan.base.BaseActivity;
import com.zhongxi.guoyuan.entity.BaseResponse;
import com.zhongxi.guoyuan.entity.beautifulStore.MyPayResult;
import com.zhongxi.guoyuan.entity.beautifulStore.PayOrderData;
import com.zhongxi.guoyuan.entity.beautifulStore.PayOrderInfo;
import com.zhongxi.guoyuan.entity.beautifulStore.PayOrderResult;
import com.zhongxi.guoyuan.entity.beautifulStore.PayOrderServiceType;
import com.zhongxi.guoyuan.entity.pay.PayAliPayData;
import com.zhongxi.guoyuan.entity.pay.PayParamsResult;
import com.zhongxi.guoyuan.entity.pay.WeixinData;
import com.zhongxi.guoyuan.url.Url;
import com.zhongxi.guoyuan.utils.DesTool;
import com.zhongxi.guoyuan.utils.GlideRoundTransform;
import com.zhongxi.guoyuan.utils.MD5Tool;
import com.zhongxi.guoyuan.utils.MyTextUtils;
import com.zhongxi.guoyuan.view.PaySuccessActivity;
import com.zhongxi.guoyuan.view.user.LoginActivity;
import com.zhongxi.guoyuan.weixin.MD5;
import com.zhongxi.guoyuan.weixin.Util;
import com.zhongxi.guoyuan.zhifubao.PayResult;
import com.zhongxi.guoyuan.zhifubao.SignUtils;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParser;

import java.io.StringReader;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;

import static com.zhongxi.guoyuan.R.id.tvContent;

public class OrderActivity extends BaseActivity implements View.OnClickListener {

    private TextView tvService;
    private TextView tvOrder;

    private String orderid;
    private String type;
    private Map<String, String> map = new HashMap<String, String>();
    private PayOrderResult result;
    private ImageView ivImg;
    private TextView tvProjectName;
    private TextView tvBeautiful;
    private TextView tvBack;
    private TextView tvTime;
    private TextView tvServiceTime;
    private ImageView ivStoreImg;
    private TextView tvStoreName;
    private TextView tvStorePhone;
    private TextView tvStoreAddress;
    private TextView tvStoreDistance;
    private TextView tvAddress;
    private TextView tvPhone;
    private TextView tvTips;
//    private RatingBar rb;
    private TextView tvCash;
    private String flag;
    private RelativeLayout goHome;
    private LinearLayout goStore;
//    private TextView tvScore;
    private TextView tvProjectPrice;
    private TextView tvMoney;
    private TextView tvTrueReward;
    private String trueInner="0";
    private String trueCash="";
    private RadioButton rbweixin;
    private RadioButton rbzhifubao;
    private int index=-1;//支付类型 0:微信 1:支付宝

    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 0:
                    PayResult payResult = new PayResult((String) msg.obj);
                    /**
                     * 对于支付结果，请商户依赖服务端的一部通知结果。同步通知结果，仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult();//同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();
                    //判断resultStatus为9000则代表支付成功
                    if(TextUtils.equals(resultStatus, "9000")){
                        //该笔订单是否真实支付成功，需要依赖服务端的异步通知
                        Intent intent = new Intent(context, PaySuccessActivity.class);
                        intent.putExtra("status", 1);
                        startActivity(intent);
                    }else{
                        startAct(PaySuccessActivity.class);
                    }
                    break;
            }
        }
    };

    private StringBuffer sb;
    private Map<String, String> resultunifiedorder;
    private PayReq req;
    private PayParamsResult paramsResult;

    @Override
    protected void initView() {
        super.initView();
        setContentView(R.layout.activity_order);
        initTitle();
        tvTitle.setText("支付确认");
        orderid = getIntent().getStringExtra("orderid");
        tvService = (TextView) findViewById(R.id.tvService);
        tvOrder = (TextView) findViewById(R.id.tvOrder);

        goHome = (RelativeLayout) findViewById(R.id.goHome);
        goStore = (LinearLayout) findViewById(R.id.goStore);

        rbweixin = (RadioButton) findViewById(R.id.rbweixin);
        rbzhifubao = (RadioButton) findViewById(R.id.rbzhifubao);
        rbweixin.setSelected(true);

        ivImg = (ImageView) findViewById(R.id.ivImg);
        tvProjectName = (TextView)findViewById(R.id.tvProjectName);
        tvBeautiful = (TextView)findViewById(R.id.tvBeautiful);
        tvCash = (TextView)findViewById(R.id.tvCash);
        tvBack = (TextView)findViewById(R.id.tvBack);
        tvTime = (TextView)findViewById(R.id.tvTime);
        tvServiceTime = (TextView)findViewById(R.id.tvServiceTime);
        ivStoreImg = (ImageView) findViewById(R.id.ivStoreImg);
        tvStoreName = (TextView)findViewById(R.id.tvStoreName);
        tvStorePhone = (TextView) findViewById(R.id.tvStorePhone);
        tvStoreAddress = (TextView) findViewById(R.id.tvStoreAddress);
        tvStoreDistance = (TextView) findViewById(R.id.tvStoreDistance);
        tvAddress = (TextView) findViewById(R.id.tvAddress);
        tvPhone = (TextView) findViewById(R.id.tvPhone);
        tvTips = (TextView) findViewById(R.id.tvTips);
//        rb = (RatingBar) findViewById(R.id.rb);
//        tvScore = (TextView) findViewById(R.id.tvScore);

        tvProjectPrice = (TextView) findViewById(R.id.tvProjectPrice);
        tvMoney = (TextView) findViewById(R.id.tvMoney);
        tvTrueReward = (TextView) findViewById(R.id.tvTrueReward);
    }
    /**
     * 初始化数据
     */
    private void setData() {
        try{
        PayOrderData service = result.getService();
        PayOrderInfo basic = result.getSubBasic();
        PayOrderServiceType subext = result.getSubExt();
        if(null!=basic&&!"".equals(basic)){
            if(null!=basic.getSubscribetype()&&!"".equals(basic.getSubscribetype())){
                flag = basic.getSubscribetype();
                if("1".equals(flag)){
                    tvService.setText("上门服务");
                    goStore.setVisibility(View.GONE);
                    goHome.setVisibility(View.VISIBLE);
                    //上门服务服务信息
                    if(null!=subext&&!"".equals(subext)){
                        if(null!=subext.getMphone()&&!"".equals(subext.getMphone())){
                            tvPhone.setText(subext.getMphone());
                        }
                        if(null!=subext.getMsg()&&!"".equals(subext.getMsg())){
                            tvTips.setText(subext.getMsg());
                        }
                        if(null!=subext.getAddress()&&!"".equals(subext.getAddress())){
                            tvAddress.setText(subext.getAddress());
                        }
                    }
                }else if("2".equals(flag)){
                    tvService.setText("到店服务");
                    goStore.setVisibility(View.VISIBLE);
                    goHome.setVisibility(View.GONE);
                    //到店服务服务信息
                    if(null!=subext&&!"".equals(subext)){
                        if(null!=subext.getName()&&!"".equals(subext.getName())){
                            tvStoreName.setText(subext.getName());
                        }
                        if(null!=subext.getAddress()&&!"".equals(subext.getAddress())){
                            tvStoreAddress.setText(subext.getAddress());
                        }
                        if(null!=subext.getPhonenum()&&!"".equals(subext.getPhonenum())){
                            tvStorePhone.setText(subext.getPhonenum());
                        }
                        if(null!=subext.getThumbnail()&&!"".equals(subext.getThumbnail())){
                            Glide.with(context).load(Url.IMG_URL+subext.getThumbnail()).placeholder(R.mipmap.iv_eg).transform(new GlideRoundTransform(context, 20)).into(ivStoreImg);
                        }
                    }
                }
            }
            if(null!=basic.getSubscribetime()&&!"".equals(basic.getSubscribetime())){
                tvServiceTime.setText(basic.getSubscribetime());
            }
        }
        if(null!=service&&!"".equals(service)){
            if(null!=service.getServiceimg()&&!"".equals(service.getServiceimg())){
                Glide.with(context).load(Url.IMG_URL+service.getServiceimg()).placeholder(R.mipmap.iv_eg).transform(new GlideRoundTransform(context, 20)).into(ivImg);
            }
            if(null!=service.getServicename()&&!"".equals(service.getServicename())){
                tvProjectName.setText(service.getServicename());
            }
            if(null!=service.getServicetime()&&!"".equals(service.getServicetime())){
                tvTime.setText(service.getServicetime()+"分钟");
            }
            if(null!=service.getShouldinnerprice()&&!"".equals(service.getShouldinnerprice())){
               // tvBeautiful.setText(service.getShouldinnerprice());
                tvProjectPrice.setText(service.getShouldprice()+"元");
            }
            if(null!=service.getShouldprice()&&!"".equals(service.getShouldprice())){
                tvCash.setText(service.getShouldprice()+"元");
                tvBack.setText("[权益会员返"+new BigDecimal(service.getShouldprice()).multiply(new BigDecimal(service.getBacksilverratio())).intValue()/100+"银币]");
            }
            tvMoney.setText(service.getShouldprice()+"元");
            tvTrueReward.setText("[权益会员返"+new BigDecimal(service.getShouldprice()).multiply(new BigDecimal(service.getBacksilverratio())).intValue()/100+"银币]");
            trueCash = service.getShouldprice();

            //支付这块暂时还不能去除美币
//            if(null!=MyApplication.getInstance().getInnerCurrency()&&!"".equals(MyApplication.getInstance().getInnerCurrency())){
//                if(Integer.parseInt(MyApplication.getInstance().getInnerCurrency())>=Integer.parseInt(service.getShouldinnerprice())){
//                  //  tvMoney.setText(service.getShouldinnerprice()+"美币+"+service.getShouldprice()+"元");
//                    tvMoney.setText(service.getShouldprice()+"元");
//                    tvTrueReward.setText("[权益会员返"+new BigDecimal(service.getShouldprice()).multiply(new BigDecimal(service.getBacksilverratio())).intValue()/100+"银币]");
//                    trueInner = service.getShouldinnerprice();
//                    trueCash = service.getShouldprice();
//                }else{
//                    //tvMoney.setText(MyApplication.getInstance().getInnerCurrency()+"美币+"+getTruePrice(service)+"元");
//                    tvMoney.setText(getTruePrice(service)+"元");
//                    tvMoney.setText(getTruePrice(service)+"元");
//                    tvTrueReward.setText("[权益会员返"+new BigDecimal(service.getShouldprice()).multiply(new BigDecimal(service.getBacksilverratio())).intValue()/100+"银币]");
//                    trueInner = MyApplication.getInstance().getInnerCurrency();
//                    trueCash = getTruePrice(service)+"";
//                }
//            }
        }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 计算实际支付人民币
     * @param service
     * @return
     */
    private BigDecimal getTruePrice(PayOrderData service) {
        float f = (Float.parseFloat(service.getShouldinnerprice())-Float.parseFloat(MyApplication.getInstance().getInnerCurrency()))/10+Float.parseFloat((service.getShouldprice()));
        BigDecimal b = new BigDecimal(f);
        return b.setScale(2, BigDecimal.ROUND_HALF_UP);
    }

    @Override
    protected void initData() {
        super.initData();
        String str = "&orderid="+orderid;
        type = "topay";
        getServer(Url.TO_PAY, null, str, false, null, "get");
    }

    @Override
    protected void initEvent() {
        super.initEvent();
        ivBack.setOnClickListener(this);
        rbweixin.setOnClickListener(this);
        rbzhifubao.setOnClickListener(this);
        tvOrder.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.ivBack:
                finish();
                break;
            case R.id.tvOrder:
                if(null==MyApplication.getInstance().getUserId()||"".equals(MyApplication.getInstance().getUserId())){
                    Intent intent = new Intent(context, LoginActivity.class);
                    intent.putExtra("position", 1);
                    startActivityForResult(intent,101);
                }else{
                    //支付校验
                    if(index==-1){
                        showShortToast("请选择支付方式");
                    }else{
                        verifypay();
                    }
                }
                break;
            case R.id.rbweixin:
                index = 0;
                break;
            case R.id.rbzhifubao:
                index = 1;
                break;
        }
    }

    /**
     * 支付校验
     */
    private void verifypay() {
        map.clear();
        type = "verifyPay";
        map.put("details",getJsonStr());
        getServer(Url.VERIFY_PAY, map, "", false, null, "post");   //服务器需要修改传参的美币
    }

    /**
     * 获取支付校验json参数字符串
     * @return
     */
    private String getJsonStr() {
        JSONObject obj = new JSONObject();
        try{
            obj.put("sid", result.getService().getSid());
            obj.put("orderid", orderid+"");
            obj.put("shouldinnerprice",result.getService().getShouldinnerprice());
            obj.put("shouldprice",result.getService().getShouldprice());
            obj.put("innerprice",trueInner);
            obj.put("price",trueCash);
        }catch (Exception e){
            e.printStackTrace();
        }
        return MyApplication.getInstance().descsc(obj.toString());

    }

    @Override
    protected void ProcessFailResult(String response) {
        super.ProcessFailResult(response);
        Gson gson = new Gson();
        BaseResponse result = gson.fromJson(response, BaseResponse.class);
        if(null!=result.getSafeobj()&&!"".equals(result.getSafeobj())){
            MyApplication.getInstance().setSpValue(result.getSafeobj());
        }
        if(result.getCode()==1032){
            showShortToast("此类项目限次24次/年，已预约满，不可再预约，请选择其他项目！");
        }
        if(result.getCode()==1000){
            showShortToast("参数错误！");
        }
    }

    @Override
    protected void processSuccessResult(String response) {
        super.processSuccessResult(response);
        Gson gson = new Gson();
        try{
            if("topay".equals(type)){
                result = gson.fromJson(response, PayOrderResult.class);
                MyApplication.getInstance().setSpValue(result.getSafeobj());
                setData();
               // showPopupWindow();
            }else if("verifyPay".equals(type)){
                MyPayResult myPayResult = gson.fromJson(response, MyPayResult.class);
                MyApplication.getInstance().setSpValue(myPayResult.getSafeobj());
                String payParams = parseSecutiryKey(myPayResult.getSecurityKey());
                Log.i("base", payParams);
                paramsResult = gson.fromJson(payParams, PayParamsResult.class);
                SharedPreferences sharedPrefrences = getSharedPreferences(Url.APP_SP, MODE_PRIVATE);
                sharedPrefrences.edit().putString("pay", "beauty").commit();
                if(index == 0){
                    //微信支付
                    weixinPay(paramsResult.getWechat());
                }else if(index == 1){
                    //支付宝支付
                    zhifubaoPay(paramsResult.getAlipay());
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 弹出美币提醒
     */
    private void showPopupWindow() {
        LayoutInflater inflater = LayoutInflater.from(this);
        LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.dialog_pay, null);
        final AlertDialog dialog = new AlertDialog.Builder(context).create();
        dialog.setCanceledOnTouchOutside(false);
        dialog.show();
        dialog.getWindow().setContentView(layout);
        TextView tvTips = (TextView) layout.findViewById(R.id.tvTips);
        TextView tvContent = (TextView) layout.findViewById(R.id.tvContent);
        TextView tvPay = (TextView) layout.findViewById(R.id.tvPay);
        TextView tvShouldPay = (TextView) layout.findViewById(R.id.tvShouldPay);
        TextView tvReward = (TextView) layout.findViewById(R.id.tvReward);
        TextView tvSurePay = (TextView) layout.findViewById(R.id.tvSurePay);
        ImageView ivCancel = (ImageView) layout.findViewById(R.id.ivCancel);
        //放弃支付
        ivCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
                finish();
            }
        });
        if(null!=result.getService()&&!"".equals(result.getService())) {
            PayOrderData service = result.getService();
            if (null != MyApplication.getInstance().getInnerCurrency() && !"".equals(MyApplication.getInstance().getInnerCurrency())) {
                if (Integer.parseInt(MyApplication.getInstance().getInnerCurrency()) >= Integer.parseInt(service.getShouldinnerprice())) {
                    tvTips.setText("恭喜！");
                    String str = "您的美币余额为"+MyApplication.getInstance().getInnerCurrency()+"美币，可以支付！";
                    SpannableString ss = MyTextUtils.stringColorSet(context, str, 7, 7+MyApplication.getInstance().getInnerCurrency().length());
                    tvContent.setText(ss);
                    tvPay.setText(service.getShouldinnerprice() + "美币+" + service.getShouldprice() + "元");
                    tvReward.setText("[权益会员返" + new BigDecimal(service.getShouldprice()).multiply(new BigDecimal(service.getBacksilverratio())).intValue()/100 + "银币]");
                } else {
                    tvTips.setText("抱歉！");
                    String str = "您的美币余额为"+MyApplication.getInstance().getInnerCurrency()+"美币，不足支付，可以用人民币兑换：1元=10美币";
                    SpannableString ss = MyTextUtils.stringColorSet(context, str, 7, 7+MyApplication.getInstance().getInnerCurrency().length());
                    tvContent.setText(ss);
                    tvPay.setText(trueInner + "美币+" + trueCash + "元");
                    tvReward.setText("[权益会员返" + new BigDecimal(service.getShouldprice()).multiply(new BigDecimal(service.getBacksilverratio())).intValue()/100 + "银币]");
                }
                tvShouldPay.setText(service.getShouldinnerprice()+"美币+"+service.getShouldprice()+"元");
            }
        }
        tvSurePay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
    }

    private IWXAPI msgApi;
    /**
     * 微信支付
     * @param wechat
     */
    private void weixinPay(WeixinData wechat) {
        msgApi = WXAPIFactory.createWXAPI(this, wechat.getAppid());
        // 将该app注册到微信
        msgApi.registerApp(wechat.getAppid());
        getWXOrderInfo();
    }

    /**
     * 获取微信支付订单
     */
    private void getWXOrderInfo() {
        //正常情况下，请求服务器获取订单参数
        req = new PayReq();
        sb = new StringBuffer();
        GetPrepayIdTask getPrepayId = new GetPrepayIdTask();
        getPrepayId.execute();
    }

    private class GetPrepayIdTask extends AsyncTask<Void, Void, Map<String,String>> {


        private ProgressDialog dialog;
        @Override
        protected void onPreExecute() {
            dialog = ProgressDialog.show(context, getString(R.string.app_tip), getString(R.string.getting_prepayid));
        }

        @Override
        protected void onPostExecute(Map<String,String> result) {
            if (dialog != null) {
                dialog.dismiss();
            }
            sb.append("prepay_id\n"+result.get("prepay_id")+"\n\n");
            resultunifiedorder=result;
            genPayReq();
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
        }

        @Override
        protected Map<String,String>  doInBackground(Void... params) {

            String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");
            String entity = genProductArgs();

            Log.e("orion",entity);

            byte[] buf = Util.httpPost(url, entity);

            String content = new String(buf);
            Log.e("orion", content);
            Map<String,String> xml=decodeXml(content);

            return xml;
        }

    }

    private void genPayReq() {

        req.appId = paramsResult.getWechat().getAppid();
        req.partnerId = paramsResult.getWechat().getSeller();
        req.prepayId = resultunifiedorder.get("prepay_id");
        req.packageValue = "Sign=WXPay";
        req.nonceStr = genNonceStr();
        req.timeStamp = String.valueOf(genTimeStamp());


        List<NameValuePair> signParams = new LinkedList<NameValuePair>();
        signParams.add(new BasicNameValuePair("appid", req.appId));
        signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
        signParams.add(new BasicNameValuePair("package", req.packageValue));
        signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
        signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
        signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));

        req.sign = genAppSign(signParams);

        sb.append("sign\n"+req.sign+"\n\n");

//        showShortToast("sb:"+sb.toString());
        Log.e("orion", signParams.toString());

        msgApi.sendReq(req);

    }

    private String genAppSign(List<NameValuePair> params) {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < params.size(); i++) {
            sb.append(params.get(i).getName());
            sb.append('=');
            sb.append(params.get(i).getValue());
            sb.append('&');
        }
        sb.append("key=");
        sb.append(paramsResult.getWechat().getPartner());

        this.sb.append("sign str\n"+sb.toString()+"\n\n");
        String appSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
        Log.e("orion",appSign);
        return appSign;
    }

    private String genOutTradNo() {
        Random random = new Random();
        return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
    }

    private String genProductArgs() {
        StringBuffer xml = new StringBuffer();
        try {
            String	nonceStr = genNonceStr();
            String trade = "";
            if((orderid+genOutTradNo()).length()>32){
                trade = (orderid+genOutTradNo()).substring(0, 32);
            }else{
                trade = orderid+genOutTradNo();
            }

            xml.append("</xml>");
            List<NameValuePair> packageParams = new LinkedList<NameValuePair>();
            packageParams.add(new BasicNameValuePair("appid", paramsResult.getWechat().getAppid()));
            packageParams.add(new BasicNameValuePair("attach", getTimeValue()+"||"+MyApplication.getInstance().getUserId()+"||"
                    +orderid+"||1"+"||"+ trueInner));
            packageParams.add(new BasicNameValuePair("body", result.getService().getServicename()));
            packageParams.add(new BasicNameValuePair("mch_id", paramsResult.getWechat().getSeller()));
            packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
            packageParams.add(new BasicNameValuePair("notify_url", Url.BASE_URL + "/api3/pay/wepay"));
            packageParams.add(new BasicNameValuePair("out_trade_no",trade));
            packageParams.add(new BasicNameValuePair("spbill_create_ip",MyApplication.getInstance().getLocalIPAddress()));
            BigDecimal bd = new BigDecimal(trueCash);
            packageParams.add(new BasicNameValuePair("total_fee", bd.multiply(new BigDecimal(100)).intValue()+""));
            packageParams.add(new BasicNameValuePair("trade_type", "APP"));

            String sign = genPackageSign(packageParams);
            packageParams.add(new BasicNameValuePair("sign", sign));

            String xmlstring =toXml(packageParams);

            Log.i("base", xmlstring);
//            return xmlstring;
            return new String(xmlstring.toString().getBytes(),"ISO8859-1");

        } catch (Exception e) {
            Log.e("base",""+e.getMessage());
            return null;
        }
    }

    private String toXml(List<NameValuePair> params) {
        StringBuilder sb = new StringBuilder();
        sb.append("<xml>");
        for (int i = 0; i < params.size(); i++) {
            sb.append("<"+params.get(i).getName()+">");


            sb.append(params.get(i).getValue());
            sb.append("</"+params.get(i).getName()+">");
        }
        sb.append("</xml>");

        Log.e("orion",sb.toString());
        return sb.toString();
    }

    public Map<String,String> decodeXml(String content) {
        try {
            Map<String, String> xml = new HashMap<String, String>();
            XmlPullParser parser = Xml.newPullParser();
            parser.setInput(new StringReader(content));
            int event = parser.getEventType();
            while (event != XmlPullParser.END_DOCUMENT) {

                String nodeName=parser.getName();
                switch (event) {
                    case XmlPullParser.START_DOCUMENT:

                        break;
                    case XmlPullParser.START_TAG:

                        if("xml".equals(nodeName)==false){
                            //实例化student对象
                            xml.put(nodeName,parser.nextText());
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        break;
                }
                event = parser.next();
            }

            return xml;
        } catch (Exception e) {
            Log.e("orion",e.toString());
        }
        return null;

    }

   private String genNonceStr() {
        Random random = new Random();
        return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
    }

    private long genTimeStamp() {
        return System.currentTimeMillis() / 1000;
    }

    /**
     生成签名（微信）
     */

    private String genPackageSign(List<NameValuePair> params) {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < params.size(); i++) {
            sb.append(params.get(i).getName());
            sb.append('=');
            sb.append(params.get(i).getValue());
            sb.append('&');
        }
        sb.append("key=");
        sb.append(paramsResult.getWechat().getPartner());

        String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
        Log.e("orion",packageSign);
        return packageSign;
    }


    /**
     * 解析后台返回的支付商户信息
     * @param securityKey
     */
    private String parseSecutiryKey(String securityKey) {
        String jsonStr = "";
        try {
            String sourcestr = MD5Tool.Md5(MyApplication.getInstance().getSk()+MyApplication.getInstance().getNow());
            String str = URLDecoder.decode(securityKey, "UTF-8");
            jsonStr = DesTool.splitdecode(sourcestr, str);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jsonStr;
    }

    /**
     * 支付宝支付
     * @param alipay
     */
    private void zhifubaoPay(PayAliPayData alipay) {

        String orderInfo = getOrderInfo(alipay);
        /**
         * 特别注意，这里的签名逻辑需要放在服务端，切勿将私钥泄露在代码中
         */
        String sign = sign(orderInfo, alipay.getRsaPrivate());
        try{
            /**
             * 仅需对sign做URL编码
             */
            sign = URLEncoder.encode(sign, "UTF-8");
        }catch (Exception e){
            e.printStackTrace();
        }
        /**
         * 完整的符合支付宝参数规范的订单信息
         */
        final String payInfo = orderInfo + "&sign=\""+sign +"\"&"+getSignType();

        Runnable payRunnable = new Runnable() {
            @Override
            public void run() {
                // 构造PayTask 对象
                PayTask alipay = new PayTask(OrderActivity.this);
                // 调用支付接口，获取支付结果
                String result = alipay.pay(payInfo, true);

                Message msg = new Message();
                msg.what = 0;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };

        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();

    }

    /**
     * create the order info. 创建订单信息（支付宝）
     *
     */
    private String getOrderInfo(PayAliPayData alipay) {

        String trade = "";
        if((result.getService().getId()+genOutTradNo()).length()>32){
            trade = (result.getService().getId()+genOutTradNo()).substring(0, 32);
        }else{
            trade = result.getService().getId()+genOutTradNo();
        }

        // 签约合作者身份ID
        String orderInfo = "partner=" + "\"" + alipay.getPartner() + "\"";

        // 签约卖家支付宝账号
        orderInfo += "&seller_id=" + "\"" + alipay.getSeller() + "\"";

        // 商户网站唯一订单号
        orderInfo += "&out_trade_no=" + "\"" + trade + "\"";

        // 商品名称
        orderInfo += "&subject=" + "\"" + result.getService().getServicename() + "\"";

        // 商品详情
        orderInfo += "&body=" + "\"" + getTimeValue()+"||"+result.getService().getUserid()+"||"
                +result.getService().getId()+"||1"+"||"+ trueInner+ "\"";

        // 商品金额
        orderInfo += "&total_fee=" + "\"" + trueCash + "\"";
//        orderInfo += "&total_fee=" + "\"" + trueCash + "\"";

        // 服务器异步通知页面路径
        orderInfo += "&notify_url=" + "\"" + Url.BASE_URL + "/api3/pay/alipay" + "\"";

        // 服务接口名称， 固定值
        orderInfo += "&service=\"mobile.securitypay.pay\"";

        // 支付类型， 固定值
        orderInfo += "&payment_type=\"1\"";

        // 参数编码， 固定值
        orderInfo += "&_input_charset=\"utf-8\"";

        // 设置未付款交易的超时时间
        // 默认30分钟，一旦超时，该笔交易就会自动被关闭。
        // 取值范围：1m～15d。
        // m-分钟，h-小时，d-天，1c-当天（无论交易何时创建，都在0点关闭）。
        // 该参数数值不接受小数点，如1.5h，可转换为90m。
        orderInfo += "&it_b_pay=\"30m\"";

        // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
        // orderInfo += "&extern_token=" + "\"" + extern_token + "\"";

        // 支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空
        orderInfo += "&return_url=\""+Url.BASE_URL+"\"";

        return orderInfo;
    }

    /**
     * sign the order info. 对订单信息进行签名（支付宝）
     *
     * @param content
     *            待签名订单信息
     */
    private String sign(String content, String rsa_private) {
        return SignUtils.sign(content, rsa_private);
    }

    /**
     * get the sign type we use. 获取签名方式（支付宝）
     *
     */
    private String getSignType() {
        return "sign_type=\"RSA\"";
    }

    /**
     * 获取当前时间戳
     * @return
     */
    private String getTimeValue(){
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String str = sdf.format(date);
        return str;
    }

}